#include "ManejadorArchivos.h"
#include "Pieza.h"

ManejadorArchivos::ManejadorArchivos(vector<ManejadorArchivo*> archivos, unsigned long int tamanioPieza) {

	this->archivos = archivos;
	this->tamanioPieza = tamanioPieza;
}

ManejadorArchivos::~ManejadorArchivos() {


}

bool ManejadorArchivos::escribir(unsigned int nroPieza, unsigned long int offset, const string &dato) {

	unsigned long long int offsetEscritura;
	unsigned int referenciaCantidadPiezas = 0;
	unsigned int referenciaCantidadPiezasAnterior = 0;
	unsigned int indiceVectorArchivos = 0;
	ManejadorArchivo* archivoActual;

	vector<ManejadorArchivo*>::iterator it = this->archivos.begin();


	while ( (referenciaCantidadPiezas < nroPieza ) && it != this->archivos.end()) {
		archivoActual = *it;
		it++;
		referenciaCantidadPiezasAnterior = referenciaCantidadPiezas;
		referenciaCantidadPiezas += getCantidadPiezas(archivoActual);
		if (!(referenciaCantidadPiezas < nroPieza)) {
			break;
		}
		indiceVectorArchivos++;
	}

	if (referenciaCantidadPiezas < nroPieza) {
		return false;
	}

	ManejadorArchivo* manejador = this->archivos[indiceVectorArchivos];

	offsetEscritura = (nroPieza - referenciaCantidadPiezasAnterior)*this->tamanioPieza + offset;
	manejador->copiarEnArchivo(offsetEscritura,dato);

	return true;
}

string ManejadorArchivos::getHashPieza(unsigned long int nroPieza) {

	unsigned int referenciaCantidadPiezas = 0;
	unsigned int referenciaCantidadPiezasAnterior = 0;
	unsigned int indiceVectorArchivos = 0;
	ManejadorArchivo* archivoActual;

	vector<ManejadorArchivo*>::iterator it = this->archivos.begin();


	while ( (referenciaCantidadPiezas < nroPieza ) && it != this->archivos.end()) {
		archivoActual = *it;
		it++;
		referenciaCantidadPiezasAnterior = referenciaCantidadPiezas;
		referenciaCantidadPiezas += getCantidadPiezas(archivoActual);
		if (!(referenciaCantidadPiezas < nroPieza)) {
			break;
		}
		indiceVectorArchivos++;
	}

	if (referenciaCantidadPiezas < nroPieza) {
		return "";
	}

	ManejadorArchivo* manejador = this->archivos[indiceVectorArchivos];

	unsigned long long int offset = (nroPieza - referenciaCantidadPiezasAnterior)*this->tamanioPieza;
	string stream = manejador->getContenidoArchivo(offset,this->tamanioPieza);

	Sha1 sha1;

	return sha1.calcularSha1(stream);
}

unsigned int ManejadorArchivos::getCantidadPiezas(ManejadorArchivo* archivo) {

	if (archivo == NULL) {
		return 0;
	}
	return (archivo->getTamanioArchivo() / this->tamanioPieza);
}
